์ž‘์„ฑ: 2026-03-04 02:11:43์ˆ˜์ •: 2026-03-04 02:11:43

REST API ์„ค๊ณ„ ๊ฐ€์ด๋“œ: HTTP ๋ฉ”์„œ๋“œ์™€ ์ƒํƒœ ์ฝ”๋“œ (GET, POST, PUT, PATCH, DELETE)

ํ˜„๋Œ€ ์›น ์•„ํ‚คํ…์ฒ˜์—์„œ **REST(Representational State Transfer)**๋Š” ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” API ์„ค๊ณ„ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. RESTfulํ•œ API๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ URL์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋„˜์–ด, HTTP ํ‘œ์ค€ ๋ฉ”์„œ๋“œ์™€ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ชฉ์ ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 2026๋…„ ๊ธฐ์ค€ ์ตœ์‹  ์‹ค๋ฌด ๊ฐ€์ด๋“œ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


1. HTTP ๋ฉ”์„œ๋“œ(Verbs)์™€ ๋ฉฑ๋“ฑ์„ฑ(Idempotency)

๊ฐ€์žฅ ํ”ํžˆ ํ•˜๋Š” ์‹ค์ˆ˜๋Š” ๋ชจ๋“  ์ˆ˜์ •์„ POST๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ์ˆ˜์ • ์‹œ PUT๊ณผ PATCH๋ฅผ ํ˜ผ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์€ **'๋ฉฑ๋“ฑ์„ฑ'**์ž…๋‹ˆ๋‹ค.

๋ฉฑ๋“ฑ์„ฑ(Idempotency): ๋™์ผํ•œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด๋„ ์„œ๋ฒ„์˜ ์ƒํƒœ๊ฐ€ ์ฒ˜์Œ ํ•œ ๋ฒˆ ๋ณด๋ƒˆ์„ ๋•Œ์™€ ๊ฐ™์€ ์„ฑ์งˆ.

๋ฉ”์„œ๋“œ์—ญํ•  (CRUD)๋ฉฑ๋“ฑ์„ฑ์„ค๋ช…
GET์กฐํšŒ (Read)Yes๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋ฟ, ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ (Safe)
POST์ƒ์„ฑ (Create)No๋ฆฌ์†Œ์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ฆ. ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ
PUT๊ต์ฒด (Replace)Yes๋ฆฌ์†Œ์Šค ์ „์ฒด๋ฅผ ์ƒˆ ๋ฐ์ดํ„ฐ๋กœ ๋ฎ์–ด์”€. ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ์ผ์ •ํ•จ
PATCH์ˆ˜์ • (Update)No*๋ฆฌ์†Œ์Šค์˜ ์ผ๋ถ€๋งŒ ์ˆ˜์ •ํ•จ. (์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉฑ๋“ฑํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋‚˜ ํ‘œ์ค€์€ ์•„๋‹˜)
DELETE์‚ญ์ œ (Delete)Yes๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•จ. ์ด๋ฏธ ์‚ญ์ œ๋œ ๋ฆฌ์†Œ์Šค์— ๋˜ ๋ณด๋‚ด๋„ ๊ฒฐ๊ณผ(์‚ญ์ œ๋จ)๋Š” ๊ฐ™์Œ

2. ์‹ค๋ฌด์—์„œ ํ—ท๊ฐˆ๋ฆฌ๋Š” PUT vs PATCH

  • PUT: "์ด ID์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๊ฐ€ ๋ณด๋‚ด๋Š” ๊ฒƒ์œผ๋กœ ํ†ต์งธ๋กœ ๋ฐ”๊ฟ”์ค˜." ๋งŒ์•ฝ ํŠน์ • ํ•„๋“œ๋ฅผ ๋ˆ„๋ฝํ•˜๊ณ  ๋ณด๋‚ด๋ฉด, ๊ทธ ํ•„๋“œ๋Š” null์ด ๋˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ์งˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • PATCH: "์ด ID์˜ ๋ฐ์ดํ„ฐ ์ค‘ ์ด ํ•„๋“œ๋“ค๋งŒ ๊ณ ์ณ์ค˜." ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„๋งŒ ๋ณด๋‚ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ํšจ์œจ์„ฑ์ด ๋†’๊ณ  ์‹ค์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์ƒํ™ฉ๋ณ„ HTTP ์ƒํƒœ ์ฝ”๋“œ (Status Codes)

ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์š”์ฒญ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ 200์ด๋‚˜ 500๋งŒ ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์˜๋ฏธ์— ๋งž๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2xx: ์„ฑ๊ณต (Success)

  • 200 OK: ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ ์„ฑ๊ณต.
  • 201 Created: ์ƒ์„ฑ(POST) ์„ฑ๊ณต. ํ—ค๋”์— ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค์˜ ์œ„์น˜(Location)๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ž…๋‹ˆ๋‹ค.
  • 204 No Content: ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ์‘๋‹ต ๋ณธ๋ฌธ์— ๋ณด๋‚ผ ๋‚ด์šฉ์ด ์—†์Œ (์ฃผ๋กœ DELETE ํ›„ ์‚ฌ์šฉ).

4xx: ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜ (Client Error)

  • 400 Bad Request: ์ž˜๋ชป๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ํ˜•์‹์œผ๋กœ ์š”์ฒญํ–ˆ์„ ๋•Œ.
  • 401 Unauthorized: ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ๋ฐ ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ.
  • 403 Forbidden: ๋กœ๊ทธ์ธ์€ ํ–ˆ์ง€๋งŒ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์ด ์—†์„ ๋•Œ.
  • 404 Not Found: ์กด์žฌํ•˜์ง€ ์•Š๋Š” URL์ด๊ฑฐ๋‚˜ ๋ฆฌ์†Œ์Šค์ผ ๋•Œ.
  • 429 Too Many Requests: ๋„ˆ๋ฌด ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ๋งŽ์€ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ (Rate Limiting).

5xx: ์„œ๋ฒ„ ์˜ค๋ฅ˜ (Server Error)

  • 500 Internal Server Error: ์„œ๋ฒ„ ์ฝ”๋“œ ๋กœ์ง ์˜ค๋ฅ˜.
  • 503 Service Unavailable: ์ ๊ฒ€ ์ค‘์ด๊ฑฐ๋‚˜ ๊ณผ๋ถ€ํ•˜๋กœ ์„œ๋ฒ„๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์ค‘๋‹จ๋จ.

4. 2026๋…„ ๊ธฐ์ค€ REST API ์„ค๊ณ„ Best Practices

  1. ๋ช…์‚ฌํ˜• URI ์‚ฌ์šฉ: /getUsers (X) โ†’ /users (O). ํ–‰์œ„๋Š” HTTP ๋ฉ”์„œ๋“œ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ณ„์ธต ๊ด€๊ณ„ ํ‘œํ˜„: /users/1/orders (์‚ฌ์šฉ์ž 1์˜ ์ฃผ๋ฌธ ๋ชฉ๋ก).
  3. ๋ณต์ˆ˜ํ˜• ์‚ฌ์šฉ: /user/1 (X) โ†’ /users/1 (O). ์ปฌ๋ ‰์…˜ ๋‹จ์œ„๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ž…๋‹ˆ๋‹ค.
  4. ๋ฒ„์ „ ๊ด€๋ฆฌ: /v1/users. API ์ŠคํŽ™ ๋ณ€๊ฒฝ์— ๋Œ€๋น„ํ•˜์—ฌ ๊ฒฝ๋กœ์— ๋ฒ„์ „์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  5. JSON ํ‘œ์ค€ ์ค€์ˆ˜: ํ•ญ์ƒ Content-Type: application/json์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  6. ๋ฉฑ๋“ฑ์„ฑ ํ‚ค(Idempotency Key): ๋„คํŠธ์›Œํฌ ์žฅ์• ๋กœ POST ์š”์ฒญ์ด ์ค‘๋ณต ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, ํ—ค๋”์— ๊ณ ์œ  ํ‚ค๋ฅผ ๋„ฃ์–ด ์ค‘๋ณต ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋ฒ•(Stripe ๋ฐฉ์‹)์ด ๋งŽ์ด ์“ฐ์ž…๋‹ˆ๋‹ค.

5. ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ์˜ ์ƒํƒœ ์ฝ”๋“œ ์ฒ˜๋ฆฌ (Q&A)

API ํ˜ธ์ถœ์€ ์„ฑ๊ณตํ–ˆ์œผ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญ ์ƒํ™ฉ์ถ”์ฒœ ์ฝ”๋“œ์‘๋‹ต ๋ณธ๋ฌธ(Body)๋น„๊ณ 
๋ชฉ๋ก/๊ฒ€์ƒ‰ ์กฐํšŒ (๊ฒฐ๊ณผ 0๊ฑด)200 OK[] (๋นˆ ๋ฐฐ์—ด)"๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Œ"๋„ ํ•˜๋‚˜์˜ ์œ ํšจํ•œ ๊ฒฐ๊ณผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
ํŠน์ • ID ์กฐํšŒ (๋ฐ์ดํ„ฐ ์—†์Œ)404 Not Found์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ฐ์ฒดํ•ด๋‹น URI์— ์ž์›์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
์‚ญ์ œ/์ˆ˜์ • ์„ฑ๊ณต (์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ถˆํ•„์š”)204 No Content(์—†์Œ)์„ฑ๊ณต์€ ํ–ˆ์œผ๋‚˜ ์ „๋‹ฌํ•  ๋ณธ๋ฌธ์ด ์—†์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Tip: 204 No Content๋ฅผ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ null ์ฒดํฌ๋‚˜ ๋นˆ ๋ฐฐ์—ด ์ฒดํฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ผ๋ฐ˜์ ์ด๋ฏ€๋กœ ๊ฒ€์ƒ‰์€ 200 + []๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ข‹์€ API๋Š” ์„ค๋ช…์„œ ์—†์ด๋„ ๊ทธ ํ˜•ํƒœ์™€ ์‘๋‹ต ์ฝ”๋“œ๋งŒ์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” API์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ๊ณง ์ตœ๊ณ ์˜ ๋ฌธ์„œํ™”์ž…๋‹ˆ๋‹ค.